import java.util.Arrays;

public class TestDemo {
    // 1 求数组的平均值:实现一个方法 avg, 以数组为参数, 求数组中所有元素的平均值(注意方法的返回值类型).
    public static int avg(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++){
            sum += arr[i];
        }
        return sum / arr.length;
    }
    public static void main1(String[] args) {
        int[] arr = {1,2,3,4,5};
        System.out.println(avg(arr));
    }

    public static int sum(int[] arr){
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        return sum;
    }
    // 2 数组所有元素之和:实现一个方法 sum, 以数组为参数, 求数组所有元素之和.
    public static void main2(String[] args) {
        int[] arr = {1,2,3,4,5};
        System.out.println(sum(arr));
    }

    /*3 改变原有数组元素的值
    实现一个方法 transform,以数组为参数,循环将数组中的每个元素乘以 2 ,并设置到对应的数组元素上.
    例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}*/
    public static void transform(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            arr[i] = 2 * arr[i];
        }
    }
    public static void main3(String[] args) {
        int[] arr = {1,2,3};
        transform(arr);
        System.out.println(Arrays.toString(arr));
    }

//    4 打印数组:实现一个方法 printArray, 以数组为参数, 循环访问数组中的每个元素, 打印每个元素的值.
    public static void printArray(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
    public static void main4(String[] args) {
        int[] arr = {1,2,3,4,5};
        printArray(arr);
    }

    // 5 冒泡排序:给定一个整型数组, 实现冒泡排序(升序排序)
    public static void main5(String[] args) {
        int[] arr = {10,2,22,3,78,9};
        for (int i = 0; i < arr.length - 1; i++) { // 第i趟
            int flag = 0; //用来判断是否继续比较
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j] > arr[j+1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    flag = 1;
                }
            }
            if(flag == 0) break; //flag=0，表示第i趟没有进行换位置的循环，则后续不用比较了
        }
        System.out.println(Arrays.toString(arr));
    }

    // 6 数组是否有序:给定一个整型数组, 判定数组是否有序（递增）
    public static void main6(String[] args) {
        int[] arr = {1,22,3,4,5};
        int flag = 0;
        for (int i = 0; i < arr.length-1; i++) {
            if(arr[i] < arr[i+1]){
                flag = 1;
            }else {
                flag = 0;
                break;
            }
        }
        if(flag == 1){
            System.out.println("递增有序");
        }else{
            System.out.println("无序");
        }
    }

    // 7 二分查找:给定一个有序整型数组, 实现二分查找
    public static void findNum(int[] arr, int key){
        int left = 0;
        int right = arr.length-1;
        while (left < right){
            int mid = (left + right) / 2;
            if(key > mid){
                left = mid + 1;
            }else if(key < mid){
                right = mid - 1;
            }else {
                System.out.println("下标是："+mid);
                break;
            }
        }
    }
    public static void main7(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        findNum(arr,7);
    }

    // 8 数组的拷贝:实现一个方法 copyOf, 对一个整型数组进行拷贝, 得到一个新的数组.
    public static void copyOf(int[] arr){
        int[] ret = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            ret[i] = arr[i];
        }
        System.out.println(Arrays.toString(ret));
    }
    public static void main8(String[] args) {
        int[] arr = {1,2,3,4,5};
        copyOf(arr);
    }

    /* 9 数组转字符串:实现一个方法 toString, 把一个整型数组转换成字符串. 例如数组 {1, 2, 3} ,
     返回的字符串为 "[1, 2, 3]", 注意 逗号 的位置和数量.*/
    public static void toString(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if(i < arr.length-1){
                System.out.print(arr[i] + ",");
            }else {
                System.out.print(arr[i]);
            }
        }
        System.out.println("]");
        int a;
    }
    public static void main9(String[] args) {
        int[] arr = {1,2,3};
        toString(arr);

    }

    // 10 奇数放到数组后面:给定整型数组, 把所有的偶数放到数组前面, 把所有奇数放到数组后面.
    public static void evenOdd(int[] arr){
        int left = 0;
        int right = arr.length - 1;
        while (left < right){
            while (left < right && arr[left] % 2 == 0){
                left++;
            }
            while (left < right && arr[right] % 2 != 0){
                right--;
            }
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
        }
    }
    public static void main10(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        evenOdd(arr);
        System.out.println(Arrays.toString(arr));
    }

    // 11 交换两个数组:给定两个整型数组, 交换两个数组的内容.
    public static void print(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
    }
    public static void main(String[] args) {
        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = {11,22,33,44,55};
        for (int i = 0; i <arr1.length; i++){
            int tmp = arr1[i];
            arr1[i] = arr2[i];
            arr2[i] = tmp;
        }
        print(arr1);
        System.out.println();
        print(arr2);
    }
}

